#include<iostream>
using namespace std;

const int N=1e5+100;
using ll=long long;

class seg_tree{
	private:
		ll val[N<<2],tag[N<<2];
		int n;
		void build(int id,int l,int r,int a[]){
			tag[0]=0;
			if(l==r){
				val[id]=a[l];
				return;
			}
			int mid=(l+r)>>1;
			build(id<<1,l,mid,a);
			build(id<<1|1,mid+1,r,a);
			val[id]=val[id<<1]+val[id<<1|1];
		}
		
		void to_down(int id,int sl,int sr){
			tag[id<<1]+=tag[id];
			tag[id<<1|1]+=tag[id];
			val[id<<1]+=tag[id]*sl;
			val[id<<1|1]+=tag[id]*sr;
			tag[id]=0;
		}
		
		void upd(int L,int R,int v,int id,int l,int r){
			if(L>r||R<l)return ;
			if(L<=l&&r<=R){
				tag[id]+=v;
				val[id]+=1ll*v*(r-l+1);
				return ;
			} 
			int mid=(l+r)>>1;
			to_down(id,mid-l+1,r-mid);
			upd(L,R,v,id<<1,l,mid);
			upd(L,R,v,id<<1|1,mid+1,r);
		}
		
		ll get(int L,int R,int id,int l,int r){
			if(L>r||R<l)return 0;
			if(L<=l&&r<=R)return val[id];
			int mid=(l+r)>>1;
			to_down(id,mid-l+1,r-mid);
			return get(L,R,id<<1,l,mid)+get(L,R,id<<1|1,mid+1,r);
		}
	public:
		seg_tree(int _n):n(_n){};
		
		void init(int a[]){
			build(1,1,n,a);
		}
		
		void add(int l,int r,int v){
			upd(l,r,v,1,1,n);
		}
		
		ll query(int l,int r){
			return get(l,r,1,1,n);
		}
		
}; 

int a[N];
int n,m;

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	seg_tree* ans=new seg_tree(n);
	ans->init(a);
	int opt,x,y,v;
	while(m--){
		cin>>opt>>x>>y;
		if(opt==1){
			cin>>v;
			ans->add(x,y,v);
		}else{
			cout<<ans->query(x,y)<<endl; 
		}
	}
	delete ans;
	return 0; 
}
